// 作用，创建一个新的对象，让创建的对象的__proto__ 指向传入的对象
function create(obj) {
  function F() {}
  F.prototype = obj;
  return new F();
}

// new 函数要注意以下，如果调用的构造函数返回了一个对象，那么new 的结果是返回这个对象
function myNew(type, ...arg) {
  let obj = create(type.prototype);
  const res = type.call(obj, ...arg);
  return res instanceof Object ? res : obj;
}

function Person(name) {
  this.name = name;
}

Person.prototype.BaBa = function () {
  console.log("I'M YOUR FATHER");
};

function Son(name) {
  Person.call(this, name);
}

Son.prototype = create(Person.prototype);

Son.prototype.constructor = Son;

Son.prototype.sayBaBa = function () {
  console.log("I'M YOUR SON");
};

let son = myNew(Son, "小明");

console.log(son);
son.sayBaBa;
son.BaBa;

console.log(son instanceof Son);

console.log(Person.prototype.constructor);
